home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 014 / tee.arc / TEE.ASM next >
Assembly Source File  |  1985-04-07  |  3KB  |  141 lines

  1.     name    tee
  2.     page    55,132
  3.     title    'TEE - tee junction for DOS pipes'
  4. ;
  5. ; TEE --- A "tee" junction for DOS 2.x pipes
  6. ;      after the fashion of the Unix function TEE
  7. ;
  8. ; By A. K. Head, 6 Duffryn Place, Melbourne, Australia 3142
  9. ;    reformatted and error handling added by Ray Duncan
  10. ;
  11. ; From Dr. Dobb's Journal, #102, April 1985, pp. 106,108,110.
  12. ; Assembled under version 3.00 of Microsoft's MASM.
  13. ;
  14. ; TEE reads from the standard input (redirectable) and
  15. ; outputs to both the standard output (redirectable)
  16. ; and a file, e.g.,:  DIR | TEE C:\MYDIR\FILE.EXT | SORT
  17. ;
  18. ; The file can be CON, LPT1, etc.  If it is CON, then
  19. ; keyboard Control-S pauses the display as usual.
  20.  
  21. command equ    80h        ; buffer for command tail
  22. buflen    equ    16384        ; buffer length, alter to taste
  23.  
  24. cr    equ    0dh        ; ASCII carriage return
  25. lf    equ    0ah        ; ASCII line feed
  26. ff    equ    0ch        ; ASCII form feed
  27. eof    equ    01ah        ; End-of-file marker
  28. tab    equ    09h        ; ASCII tab code
  29. blank    equ    20h        ; ASCII blank
  30.  
  31.                 ; DOS 2.x predefined handles
  32. stdin    equ    0000        ; standard input file
  33. stdout    equ    0001        ; standard output file
  34. stderr    equ    0002        ; standard error file
  35. stdaux    equ    0003        ; standard auxilliary file
  36. stdprn    equ    0004        ; standard printer file
  37.  
  38.  
  39. cseg    segment para public 'CODE'
  40.  
  41.     assume    cs:cseg,ds:cseg
  42.  
  43.     org    100H        ; start .COM at 100H
  44.  
  45. tee    proc    far
  46.  
  47.     mov    cl,ds:command    ; get length of command tail
  48.     xor    ch,ch
  49.                 ; address of command string
  50.     mov    si,offset command+1
  51.     mov    di,offset command+1
  52. tee1:                ; squeeze out leading spaces
  53.     mov    al,byte ptr [si]
  54.     cmp    al,blank
  55.     jbe    tee2
  56.     mov    byte ptr [di],al
  57.     inc    di
  58.  
  59. tee2:    inc    si        ; look through command tail
  60.     loop    tee1        ; until it's exhausted.
  61.     mov    byte ptr [di],0 ; make ASCIIZ string.
  62.  
  63.     mov    ah,3ch        ; create output file.
  64.     mov    cx,0        ; attribute=0.
  65.     mov    dx,offset command+1
  66.     int    21h
  67.     jc    tee6        ; can't create file
  68.     mov    handle,ax    ; save token for file.
  69.  
  70. tee3:    mov    ah,3fh        ; read standard input.
  71.     mov    bx,stdin
  72.     mov    cx,buflen
  73.     lea    dx,buffer
  74.     int    21h
  75.     jc    tee4        ; jump, error
  76.     mov    nchar,ax    ; save length of read.
  77.     cmp    ax,0        ; nothing read in?
  78.     je    tee4        ; end of file, exit.
  79.     mov    ah,40h        ; write to file...
  80.     mov    bx,handle
  81.     mov    cx,nchar
  82.     int    21h
  83.     jc    tee7        ; jump, write failed.
  84.     cmp    ax,nchar
  85.     jne    tee7        ; jump, write failed.
  86.     mov    ah,40h        ; now write to standard output...
  87.     mov    bx,stdout
  88.     int    21h
  89.     jc    tee7        ; jump, write failed.
  90.     cmp    ax,nchar
  91.     jne    tee7        ; jump, write failed.
  92.     jmp    tee3        ; read again until end of file.
  93.  
  94. tee4:    mov    ah,3eh        ; close output file.
  95.     mov    bx,handle
  96.     int    21h
  97.  
  98. tee5:    mov    ax,4c00h    ; exit with return code=0.
  99.     int    21h
  100.  
  101. tee6:    mov    dx,offset err1    ; print "Can't create file".
  102.     mov    cx,err1len
  103.     mov    ah,40h        ; display error message and exit.
  104.     mov    bx,stderr
  105.     int    21h
  106.     mov    ax,4c01h    ; exit with error code=1.
  107.     int    21h
  108.  
  109. tee7:    mov    dx,offset err2    ; print "Disk is full".
  110.     mov    cx,err2len
  111.     mov    ah,40h        ; display error message and exit.
  112.     mov    bx,stderr
  113.     int    21h
  114.     mov    ah,3eh        ; close output file.
  115.     mov    bx,handle
  116.     int    21h
  117.     mov    ax,4c02h    ; exit with return code=2.
  118.     int    21h
  119.  
  120. tee    endp
  121.  
  122. nchar    dw    0        ; number of chars actually input.
  123. handle    dw    0        ; token for output file.
  124.  
  125. err1    db    cr,lf
  126.     db    'tee: Cannot create file.'
  127.     db    cr,lf
  128. err1len =    (this byte)-(offset err1)
  129.  
  130. err2    db    cr,lf
  131.     db    'tee: Disk is full.'
  132.     db    cr,lf
  133. err2len =    (this byte)-(offset err2)
  134.  
  135. buffer    equ    this byte    ; data is read here from
  136.                 ; standard input
  137.  
  138. cseg    ends
  139.  
  140.     end    tee
  141.